package br.com.jspl.app.devices;

import java.awt.Graphics;
import java.util.LinkedList;

import javax.swing.JOptionPane;

/**
 * Essa classe tem por objetivo armazenar as informaes referentes
 * aos circuitos
 * @author Rodrigo antonio
 *
 */
public class Circuito {
	private LinkedList<Componente> ListaComponetes;
	private boolean ligado;
	private ProtoBoard pb;
	
	Circuito(ProtoBoard p) {
		ListaComponetes = new LinkedList<Componente>();
		ligado=false;
		pb=p;
	}	

	public boolean sair() {
		if(ListaComponetes.size()>0) {
			if (JOptionPane.showConfirmDialog(pb, "O circuito atual nao foi salvo\nDeseja realmente sair?", "Confirmação", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) return true;
			return false;
		}
		return true;
	}
	
	public void adicionaComponete(Componente c ) {
		ListaComponetes.add(c);
	}
	
	public void removeComponente(Componente c) {
		ListaComponetes.remove(c);
	}
	
	public void desenha(Graphics g) {
		Componente compAt;
		for(int x=0;x<ListaComponetes.size();x++) {
			compAt = (Componente) ListaComponetes.get(x);	
			compAt.desenhar(g);
		}
	}
	
	public void ligaCircuito() {
		Componente compAt = null;
		int a=0;
		try {
			for(a=0;a<100;a++) {
				for(int x=0;x<ListaComponetes.size();x++) {
					compAt = (Componente) ListaComponetes.get(x);
					if (!(compAt instanceof Cabo)) {
						compAt.AtivarComponente();
					} 
				}
			}
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, "O componente \"" + compAt.getNome() + "\" est\u00e1 sem conex\u00e3o");
		}
		
		if (a>100) {
			JOptionPane.showMessageDialog(pb,"Existe componentes sem ligao");
		}
		setLigado(true);
	}
	
	public void desligaCircuito() {
		Componente compAt;
		for(int x=0;x<ListaComponetes.size();x++) {
			compAt = (Componente) ListaComponetes.get(x);
			if  (compAt instanceof Cabo ) {
				Cabo c = (Cabo) compAt;
				c.setAtualizado(false);
			}
		}
		setLigado(false);
	}
	
	public void novo() {
		setLigado(false);
		for(int x=0;x<ListaComponetes.size();x++) {
			ListaComponetes.remove(x);
		}
		pb.setCircuitoAtual(new Circuito(pb));
		pb.removeAll();
		pb.reiniciaPonteiro();
		pb.repaint();
	}
	
	public boolean getLigado() {
		return ligado;
	}
	
	public void setLigado(boolean ligado) {
		this.ligado = ligado;
	}
	
	public LinkedList<Componente> getListaComponetes() {
		return ListaComponetes;
	}
}
